/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Engine;

import admin.gameInterface;
import java.util.ArrayList;
import paket.BoardPanel;
import paket.Hero;
import paket.Kopyalama;

/**
 *
 * @author mete
 */
public class Engine {

    public static int sayac = 0;  // rakip arttıracakk bunu
    public int ourTeam = paket.BoardPanel.ourTeam;
    public int rakipTeam = paket.BoardPanel.rakipTeam;
    public int derinlik = 2;
    public int ustDeger;
    public paket.Hero[][] sec;

    public Engine() {
    }

    public paket.Hero[][] play(paket.Hero[][] heroes, int takim) {
        /*System.out.println("-------------------------------------");
        Hero.Yazdir(heroes);
        System.out.println("-------------------------------------");*/
        sec = new paket.Hero[BoardPanel.ROWS][BoardPanel.COLS];
        ustDeger = 10000;
        biz(heroes, 0);
        ustDeger = 10000;
        /*System.out.println("-------------------------------------");
        Hero.Yazdir(sec);
        System.out.println("-------------------------------------");
         */
        return sec;// null yerine hareket edenin index i gönderilecek
    }

    public int biz(paket.Hero[][] heroes, int level) {
        paket.hareket hr;
        String renk = "blue";
        if (ourTeam == 1) {
            renk = "kirmizi";
        }

        ArrayList list;
        BestNod superDugum = new BestNod();
        paket.Hero[][] klon = null;
        int deger = 0;
        for (int i = 0; i < paket.BoardPanel.ROWS; i++) {
            for (int j = 0; j < paket.BoardPanel.COLS; j++) {
                if (heroes[i][j] != null) {
                    if (heroes[i][j].getTeamRenk().equals(renk)) {

                        list = heroes[i][j].hamleleriDondur(heroes, i, j);

                        for (int f = 0; f < list.size(); f++) {
                            if (level < derinlik) {
                                klon = paket.Hero.makeHero((gameInterface) list.get(f));
                                hr = paket.Hero.diffHero(heroes, klon);
                                tahtaPuanHesapla(klon, ourTeam, hr);
                                deger = rakip(klon, level);
                                //System.out.println("Degerrrrrrrr:"+deger);

                                if (deger < superDugum.getPuan()) {
                                    //System.out.println("Deger ataması yapiliyor...");
                                    superDugum.setPuan(deger);
                                    superDugum.setHeroDizisi(klon);
                                }

                                if (ustDeger > deger) {
                                    return deger;
                                }
                            } else {
                                return deger;
                            }

                        }
                        if (level == 0) {
                            System.out.println("SEC atanirrr...................");
                            sec = superDugum.getHeroDizisi();
                            Hero.Yazdir(superDugum.getHeroDizisi());
                        }
                        if (sec == null) {
                            sec = heroes;
                        }
                    }
                }
            }
        }
        return 1;
    }

    // fdsfsfffffffffffffffffffffffffffff
    public int rakip(paket.Hero[][] heroeses, int level) {
        paket.hareket hr;
        String renk = "blue";
        if (ourTeam == 1) {
            renk = "kirmizi";
        }
        paket.Hero[][] heroes = Kopyalama.cloneArray(heroeses);
        paket.Hero[][] eniyidugum = new paket.Hero[paket.BoardPanel.ROWS][paket.BoardPanel.COLS];

        // ArrayList <paket.Hero[][]> list=new  ArrayList<paket.Hero[][]>();
        ArrayList list;
        for (int i = 0; i < paket.BoardPanel.ROWS; i++) {
            for (int j = 0; j < paket.BoardPanel.COLS; j++) {
                if (heroes[i][j] != null) {
                    if (heroes[i][j].getTeamRenk().equals(renk)) {

                        list = heroes[i][j].hamleleriDondur(heroes, i, j);
                        int deger = 0;
                        for (int f = 0; f < list.size(); f++) {
                            System.out.println("LEVEL: " + level);
                            int temp;
                            paket.Hero[][] klon = paket.Hero.makeHero((gameInterface) list.get(f));
                            if (level == derinlik - 1) {
                                hr = paket.Hero.diffHero(heroes, klon);
                                tahtaPuanHesapla(klon, rakipTeam, hr);
                                System.out.println("Rakippp-----------------:" + i + ":" + ":" + j + ":" + f);
                                Hero.Yazdir(klon);
                                System.out.println("Rakipppppp-----------------");

                                temp = tahtaDegeri(heroes, rakipTeam);
                                if (ustDeger == 10000) {
                                    ustDeger = temp;
                                }
                            } else {
                                System.out.println("Tahta degeriiii" + tahtaDegeri(heroes, rakipTeam));
                                temp = biz(klon, level + 1);
                            }
                            if (ustDeger < temp) {
                                System.out.println("Budama yapiliyor...");
                                return temp;
                            }
                            if (deger < temp) {
                                deger = temp;
                            }


                        }
                        return deger;

                    }
                }
            }
        }
        return 0;
    }

    public int tahtaDegeri(paket.Hero[][] heroes, int takim) {

        System.out.println("deger hesaplaaaaa");

        // tahtanın o takıma iat puan değeri.
        String renk = "blue";
        if (ourTeam == 1) {
            renk = "kirmizi";
        }

        int cost = 0;
        System.out.println("costum : " + cost);
        int bizimSaglik = 0;
        int rakipSaglik = 0;
        int bizimHeroSayisi = 0;
        int rakipHeroSayisi = 0;

        int verilen_hasar = 0;
        int alinan_hasar = 0;

        int atkonum = 0;
        int okkonum = 0;
        int Lancekonum = 0;

        int bizSagligiKritikHeroSay = 0;
        int rakipSagligiKritikHeroSay = 0;

        for (int i = 0; i < paket.BoardPanel.ROWS; i++) {
            for (int j = 0; j < paket.BoardPanel.COLS; j++) {
                if (heroes[i][j] != null) {
                    if (heroes[i][j].getTeamRenk().equals(renk)) {

                        bizimSaglik = bizimSaglik + heroes[i][j].getHealth();   // sağlıkları toplandı
                        bizimHeroSayisi = bizimHeroSayisi + 1;
                        if (heroes[i][j].getHealth() <= 2) {
                            bizSagligiKritikHeroSay = bizSagligiKritikHeroSay + 1;
                        }
                        if (heroes[i][j].getName().equals("Knight")) {
                            if (j > 4) {
                                atkonum = j - (BoardPanel.COLS - 1) / 2;
                            } else {
                                atkonum = (BoardPanel.COLS - 1) / 2 - j;
                            }
                        }
                        if (heroes[i][j].getName().equals("Archer")) {
                            if (j > 4) {
                                okkonum = j - (BoardPanel.COLS - 1) / 2;
                            } else {
                                okkonum = (BoardPanel.COLS - 1) / 2 - j;
                            }
                        }
                        if (heroes[i][j].getName().equals("Lance")) {
                            if (j > 4) {
                                Lancekonum = j - (BoardPanel.COLS - 1) / 2;
                            } else {
                                Lancekonum = (BoardPanel.COLS - 1) / 2 - j;
                            }
                        }
                        // verilen hasar hesaplamaları
                        verilen_hasar = verilen_hasar + heroes[i][j].fight(heroes, i, j);  //  tahta bu duruma gelirken
                        //  toplam ne kadar zarar verilmiş.
                        System.out.println("yaz ülen hasarı 2 : " + verilen_hasar);
                    } else {
                        rakipSaglik = rakipSaglik + heroes[i][j].getHealth();    // sağlıkları toplandı
                        rakipHeroSayisi = rakipHeroSayisi + 1;
                        if (heroes[i][j].getHealth() <= 2) {
                            rakipSagligiKritikHeroSay = rakipSagligiKritikHeroSay + 1;
                        }
                        alinan_hasar = alinan_hasar + (int) heroes[i][j].fight(heroes, i, j);
                        System.out.println("yaz ülen alınan hasarı 2 : " + alinan_hasar);
                    }
                }
            }
        }
        int t;

        cost = cost + verilen_hasar;
        cost = cost - alinan_hasar;
        t = bizimSaglik - rakipSaglik;
        cost = cost + t;


        t = bizimHeroSayisi - rakipHeroSayisi;
        cost = cost + t;

        t = bizSagligiKritikHeroSay - rakipSagligiKritikHeroSay;
        cost = cost + t;


        atkonum = (3 - atkonum);
        okkonum = (3 - okkonum);
        Lancekonum = (3 - Lancekonum);

        //   cost=cost+okkonum+2;
        //   cost=cost+atkonum;
        //   cost=cost+Lancekonum+1;
        System.out.println("cost : " + cost);
        return cost;
    }

    public void tahtaPuanHesapla(paket.Hero[][] heroes, int takim, paket.hareket hr) {
        // burada heroların içindeki savaş metotu çalıştırılacak tek tek
        //  ve geri dönen değerler toplanarak puan hesaplanacak.
        // herolar'ın fight' ıçalıştırılacak, her hero old yerde savaşacak.
        String renk = "blue";
        if (takim == 1) {
            renk = "kirmizi";
        }
        int verilenZarar = 0;
        int alinanZarar = 0;

        for (int i = 0; i < paket.BoardPanel.ROWS; i++) {
            for (int j = 0; j < paket.BoardPanel.COLS; j++) {
                //  try{
                if (heroes[i][j] != null) {
                    //System.out.println("alooo");
                    if (heroes[i][j].getTeamRenk().equals(renk)) {
                        // System.out.println("bbbbbbbbbb");
                        int k = heroes[i][j].fight(heroes, i, j);
                        System.out.println("savaşan : " + heroes[i][j] + " vuruşu : " + k);
                        verilenZarar = verilenZarar + k;
                    }
                }
                //   }catch(Exception e){
                //          System.out.println("tahta puanda hata : "+e);
                //          System.out.println("i : "+i +" , j : "+ j);
                //          System.out.println("savaşan : "+heroes[i][j]+" vuruşu : ");
                //  }
            }
        }
        System.out.println("---------------Hasar----------- 2");
        Hero.Yazdir(heroes);
        System.out.println("---------------Hasar-----------");
        alinanZarar = hareketPuaniDusur(heroes, takim, hr);
        System.out.println("---------------Hasar----------- 1");
        Hero.Yazdir(heroes);
        System.out.println("---------------Hasar-----------");
        //return heroes;
    }

    public ArrayList<paket.Hero[][]> hamleListesiOlustur(Hero[][] heroes, int takim) {
        // takim : hangi takımın oyuncularının hamlesi hesaplanacak.
        ArrayList<paket.Hero[][]> hamleListesi = new ArrayList<paket.Hero[][]>();

        ArrayList<paket.Hero[][]> geciciListe = new ArrayList<paket.Hero[][]>();
        String renk = "blue";
        if (takim == 1) {
            renk = "kirmizi";
        }
        System.out.println("for a girmeden");
        for (int i = 0; i < paket.BoardPanel.ROWS; i++) {
            for (int j = 0; j < paket.BoardPanel.COLS; j++) {
                if (heroes[i][j] != null) {
                    if (heroes[i][j].getTeamRenk().equals(renk)) {
                        geciciListe = (ArrayList<Hero[][]>) heroes[i][j].hamleleriDondur(heroes, i, j);

                        for (int k = 0; k < geciciListe.size(); k++) {
                            hamleListesi.add(geciciListe.get(k));
                        }
                        try {
                            System.out.println("hero : " + heroes[i][j].getClass() + " size :  " + geciciListe.size() + " hamle : " + geciciListe);
                        } catch (Exception e) {
                            System.out.println("e : " + e + " fdsf : " + heroes[i][j]);
                        }
                    }
                }
            }
        }
        return hamleListesi;

        // for döngüsü kur
        //her hero yu kendi sınıfına gönder
        // gelen boardları hamleListesine ekle

    }

    public int hareketPuaniDusur(paket.Hero[][] heroes, int takim, paket.hareket hr) { // hareket sonrası puan hesaplaması
        String renk = "blue";
        if (takim == 1) {
            renk = "kirmizi";
        }

        for (int i = 0; i < paket.BoardPanel.ROWS; i++) {
            for (int j = 0; j < paket.BoardPanel.COLS; j++) {
                try {
                    if (heroes[i][j] != null) {
                        if (heroes[i][j].getTeamRenk().equals(renk)) {  // aynı takımsa
                            heroes[i][j].setHealth((heroes[i][j].getHealth() - 2)); // butun karakterlerden -2 duser
                        }                                                         // aşağılarda ise oynayana
                    }                                                           //   +1 ilave edilecek
                } catch (Exception e) {
                    System.out.println("e : " + e);
                }
            }
        }

        if (hr != null) {
            if (hr.getX2() != -1 && hr.getY2() != -1) {
                heroes[hr.getX2()][hr.getY2()].setHealth((heroes[hr.getX2()][hr.getY2()].getHealth() + 1));
            }                              // hareket ettiği için ilave edildi
        }
        return 0;
    }
}
